import sys
from PyQt5.QtWidgets import QApplication, QWidget, QTreeWidget, QTreeWidgetItem, QVBoxLayout


def on_item_clicked(item, column):
    """
    处理节点点击事件的函数
    :param item: 被点击的节点
    :param column: 被点击的列
    """
    node_name = item.text(0)
    node_description = item.text(1)
    # 获取额外信息
    extra_info = item.data(0, 32)  # 32 是自定义的用户数据角色
    print(f"点击了节点: {node_name}，列: {column}，描述: {node_description}，额外信息: {extra_info}")


app = QApplication(sys.argv)

# 创建主窗口
window = QWidget()

# 创建 QTreeWidget
tree_widget = QTreeWidget()
# 设置列数
tree_widget.setColumnCount(2)
# 设置列标题
tree_widget.setHeaderLabels(['名称', '描述'])

# 创建根节点
root = QTreeWidgetItem(tree_widget, ['根节点', '这是根节点的描述'])
# 为根节点设置额外信息
root.setData(0, 32, "根节点的额外信息")

# 创建子节点
child1 = QTreeWidgetItem(root, ['子节点 1', '这是子节点 1 的描述'])
child1.setData(0, 32, "子节点 1 的额外信息")
child2 = QTreeWidgetItem(root, ['子节点 2', '这是子节点 2 的描述'])
child2.setData(0, 32, "子节点 2 的额外信息")

# 为子节点 1 创建子子节点
sub_child1 = QTreeWidgetItem(child1, ['子子节点 1', '这是子子节点 1 的描述'])
sub_child1.setData(0, 32, "子子节点 1 的额外信息")

# 展开根节点
root.setExpanded(True)

# 连接节点点击事件到处理函数
tree_widget.itemClicked.connect(on_item_clicked)

# 创建布局并添加 QTreeWidget
layout = QVBoxLayout()
layout.addWidget(tree_widget)

# 将布局设置给主窗口
window.setLayout(layout)

# 显示窗口
window.show()

# 进入应用程序的主循环
sys.exit(app.exec_())
